﻿// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
using Azure.Core.Pipeline;

namespace Azure.Core.Tests
{
    public class PipelineTestBase
    {
        private readonly bool _isAsync;

        public PipelineTestBase(bool isAsync)
        {
            _isAsync = isAsync;
        }

        protected async Task ProcessAsync(HttpMessage message, HttpPipelineTransport transport, CancellationToken cancellationToken = default)
        {
            message.CancellationToken = cancellationToken;
            if (_isAsync)
            {
                await transport.ProcessAsync(message);
            }
            else
            {
                transport.Process(message);
            }
        }

        protected async Task<Response> ExecuteRequest(Request request, HttpPipelineTransport transport, CancellationToken cancellationToken = default)
        {
            var message = new HttpMessage(request, ResponseClassifier.Shared);
            message.CancellationToken = cancellationToken;
            if (_isAsync)
            {
                await transport.ProcessAsync(message);
            }
            else
            {
                transport.Process(message);
            }
            return message.Response;
        }

        protected async Task<Response> ExecuteRequest(Request request, HttpPipeline pipeline, CancellationToken cancellationToken = default)
        {
            var message = new HttpMessage(request, ResponseClassifier.Shared);
            return await ExecuteRequest(message, pipeline, cancellationToken);
        }

        protected async Task<Response> ExecuteRequest(HttpMessage message, HttpPipeline pipeline, CancellationToken cancellationToken = default)
        {
            if (_isAsync)
            {
                await pipeline.SendAsync(message, cancellationToken);
            }
            else
            {
                pipeline.Send(message, cancellationToken);
            }
            return message.Response;
        }

        protected X509Certificate2 GetCertificate(string pfx)
        {
            byte[] cer = Convert.FromBase64String(pfx);

#if NET9_0_OR_GREATER
            return X509CertificateLoader.LoadPkcs12(cer, null);
#else
            return new X509Certificate2(cer);
#endif
        }

        protected const string Pfx = @"
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
10dutJHzmsRcVFCBZvojiMDovF2Ge98xh3A2AGvN/nEQBayKPqSTL4JggC+K+TpizW82MDMqcp/n
fEtWJ5v0TDBlWqapKwi12hN2JIwmfWgowKfQar2FMBB1B5agHCTHXmVY8lRBqW2dSC+lUUPakHSr
IMEfjBTm8VD+GYvnlD/1wxmsooVsxDEOvxFsLgcXlY2/5SqsLSmSEmqIjGtwcOOn6brhXBBx8V/T
VsdRw00ounu+gApAFsCSGM4/O2IRRoNpLkZrSG8v9SFj5ieZqo53mb6USyhDlgL670P/oO7C+Ta0
icNR55z/h8Yu8NBPtQ6Ahsou8/wXDnbkxqjx8LwLlGsZuHmzPecBQicn0wgRa4c2z98ycyPoLcvF
o0R6D5prvHXY3ej3wtzytXiBAcJk3Yh1BQbVUBWftRqm2TcBa5TIkvdDoNP+UWDPHoxEP008gkJp
gX0aU+xI9doprq9xM/QFClPnnHyFN6lqHUFEOT8fNAKS3bQZtZPn7Iqn0rtmtWv06wCNfdlh7MGg
fIcx1Eks2bA4nMCnA7PJaG5PDaCQsxW4yiyQhC6cNz81ZpuSqmzBdToDjwTIaOiDVfAAPhzO8284
LPp2FuLEUgVyRGJ0hCgHDIqEMp7C7sgK2uWcUUGBiHXusFuA6C3WDqLsjriCtvWkIcL4v4ByKxqh
16nPBt09mhRXXzO9gKtVJ0cvTfLyKgyIHTjQnLJLuHpKiJ/9SqrWHOv6CwTUk2OV51VedYe3emr7
Fa9dt6EPvzLTbLdB/CnEOPzh7aInR/iaiWMSNxOE7AJ8hACU8/C3QEDsjnUK6LoTzC71jWAdCPcZ
1uze0fhHYwZ67rWneQOShhHEfX2Vxlm1R8L4sbPppFHrIygR9KCPjUUj8OTNvwQUumdqE0C8iNyQ
T4E0NzGB3zATBgkqhkiG9w0BCRUxBgQEAQAAADBbBgkqhkiG9w0BCRQxTh5MAHsARQBDADkAMwBC
ADcANQA1AC0AQwA5ADYAMwAtADQANgBBADAALQA5AEIARQBDAC0ANAAzADQANgBDADkARQA4AEYA
MwBBADkAfTBrBgkrBgEEAYI3EQExXh5cAE0AaQBjAHIAbwBzAG8AZgB0ACAARQBuAGgAYQBuAGMA
ZQBkACAAQwByAHkAcAB0AG8AZwByAGEAcABoAGkAYwAgAFAAcgBvAHYAaQBkAGUAcgAgAHYAMQAu
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
AAAAAAAA";

        protected const string Pfx2 = @"
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";
    }
}
